HSLãšLabè²ç©ºéã«çŠç¹ãåœãŠãCSSçžå¯Ÿè²æ§æã®å æ¬çã¬ã€ããWebãã¶ã€ããŒãåçã§ã¢ã¯ã»ã·ãã«ãªé è²ãäœæããããã®åãäžããŸãã
CSSçžå¯Ÿè²æ§æã®åŸ¹åºè§£èª¬ïŒã°ããŒãã«ãªWebãã¶ã€ã³ã®ããã®HSLãšLabè²ç©ºé
Webãã¶ã€ã³ã®äžçã¯åžžã«é²åããŠãããããã«äŒŽããèŠèŠçã«é åçã§ã¢ã¯ã»ã·ãã«ãªäœéšãåµé ããããã«äœ¿çšããããŒã«ãæè¡ãé²åããŠããŸããæè¿CSSã«è¿œå ãããæããšããµã€ãã£ã³ã°ãªæ©èœã®äžã€ãçžå¯Ÿè²æ§æïŒRelative Color SyntaxïŒã§ãããã®åŒ·åãªæ©èœã«ãããCSSå ã§çŽæ¥è²ãæäœããåçãªããŒãã埮åŠãªããªãšãŒã·ã§ã³ããããŠã¢ã¯ã»ã·ãã«ãªãã¶ã€ã³ããããç°¡åãã€æè»ã«äœæããããšãã§ããŸãããã®èšäºã§ã¯ãHSLãšLabè²ç©ºéã«çŠç¹ãåœãŠãçžå¯Ÿè²æ§æã®è€éããæãäžããäžçäžã®ãããžã§ã¯ãã§ãããã©ã®ããã«æŽ»çšã§ããããæ¢ããŸãã
CSSçžå¯Ÿè²æ§æãšã¯ïŒ
çžå¯Ÿè²æ§æãç»å Žããåã¯ãCSSã§è²ãæäœããã«ã¯SassãLessã®ãããªããªããã»ããµã䜿çšããããJavaScriptã«é ŒãããšããããããŸãããçžå¯Ÿè²æ§æã¯ãæ¢åã®è²ãCSSã«ãŒã«å ã§çŽæ¥å€æŽã§ããããã«ããããšã§ããã®ç¶æ³ãå€ããŸããããã¯ãè²ãæ§æããåã ã®èŠçŽ ïŒHSLã«ãããè²çžã圩床ãèŒåºŠãªã©ïŒãåç §ãããããã«æ°åŠçãªæäœãé©çšããããšã«ãã£ãŠè¡ãããŸããããã«ãããäºåã«è€æ°ã®è²ã®ããªãšãŒã·ã§ã³ãå®çŸ©ããå¿ èŠãªããçŸåšã®å€ã«åºã¥ããŠè²ãæããããããæããããã圩床ãäžãããäžããããè²çžã倿Žãããããããšãã§ããŸãã
ãã®æ§æã¯color()
颿°ãåºã«æ§ç¯ãããŠãããè²ç©ºéïŒhsl
, lab
, lch
, rgb
, oklab
ãªã©ïŒã倿Žããåºæ¬è²ããããŠåžæãã調æŽãæå®ã§ããŸããäŸãã°ïŒ
.element {
color: color(hsl red calc(h + 30) s l);
}
ãã®ã¹ããããã¯èµ€è²ãåããhsl
è²ç©ºéã䜿çšããè²çžã30床å¢å ãããŸããh
ãs
ãl
ã¯ããããæ¢åã®è²çžã圩床ãèŒåºŠã®å€ã衚ããŸããcalc()
颿°ã¯æ°åŠçãªæäœãè¡ãäžã§éåžžã«éèŠã§ãã
ãªãHSLãšLabãªã®ãïŒ
çžå¯Ÿè²æ§æã¯æ§ã ãªè²ç©ºéã§æ©èœããŸãããHSLãšLabã¯è²ã®æäœãšã¢ã¯ã»ã·ããªãã£ã«ãããŠæç¢ºãªå©ç¹ãæäŸããŸãããã®çç±ãæ¢ã£ãŠã¿ãŸãããïŒ
HSLïŒè²çžã圩床ãèŒåºŠïŒ
HSLã¯ã人éã®ç¥èŠã«åºã¥ããŠè²ãçŽæçã«è¡šçŸããåç座æšã®è²ç©ºéã§ãã以äžã®3ã€ã®èŠçŽ ã§å®çŸ©ãããŸãïŒ
- è²çžïŒHueïŒ: ã«ã©ãŒãã€ãŒã«äžã®è²ã®äœçœ®ïŒ0-360床ïŒãéåžžãèµ€ã0床ãç·ã120床ãéã240床ã§ãã
- 圩床ïŒSaturationïŒ: è²ã®åŒ·åºŠãŸãã¯çŽåºŠïŒ0-100%ïŒã0%ã¯ã°ã¬ãŒã¹ã±ãŒã«ã100%ã¯å®å šã«é£œåããè²ã§ãã
- èŒåºŠïŒLightnessïŒ: è²ã®ç¥èŠçãªæããïŒ0-100%ïŒã0%ã¯é»ã100%ã¯çœã§ãã
HSLã®å©ç¹ïŒ
- çŽæçãªæäœïŒ HSLã¯ç¥èŠçãªå質ã«åºã¥ããŠè²ãç°¡åã«èª¿æŽã§ããŸããèŒåºŠãäžãããšè²ãæãããªãã圩床ãäžãããšè²ããããã§èŠããè²çžãå€ãããšã«ã©ãŒãã€ãŒã«ã«æ²¿ã£ãŠè²ãå€åããŸãã
- ã«ã©ãŒã¹ããŒã ã®äœæïŒ HSLã¯èª¿åã®ãšããã«ã©ãŒã¹ããŒã ã®äœæããã»ã¹ãç°¡çŽ åããŸããè£è²ïŒè²çž+180床ïŒãé¡äŒŒè²ïŒè²çžãè¿ãè²ïŒããŸãã¯ãã©ã€ã¢ãé è²ïŒè²çžã120床é¢ããè²ïŒãç°¡åã«çæã§ããŸãã
- åçãªããŒãèšå®ïŒ HSLã¯åçãªããŒãèšå®ã«æé©ã§ããåºæ¬è²ãå®çŸ©ããçžå¯Ÿè²æ§æã䜿çšããŠã©ã€ãã¢ãŒããšããŒã¯ã¢ãŒãçšã®ç°ãªãããªãšãŒã·ã§ã³ãçæã§ããŸãã
äŸïŒããŒã¯ã¢ãŒãããŒãã®äœæ
ãã©ã³ãã«ã©ãŒã#007bff
ïŒé®®ãããªéïŒã ãšããŸããHSLã䜿çšããŠãäœå
鿡件äžã§ç®ã«åªããããã€ãã©ã³ãã®æ¬è³ªãç¶æããããŒã¯ã¢ãŒãããŒããäœæã§ããŸãã
:root {
--brand-color: #007bff;
--brand-color-hsl: color(oklch #007bff h s l);
--bg-color: #fff;
--text-color: #000;
}
@media (prefers-color-scheme: dark) {
:root {
--bg-color: #121212; /* æãç°è² */
--text-color: #fff;
--brand-color: color(hsl var(--brand-color) h calc(s * 0.8) calc(l * 1.2)); /* ãã©ã³ãã«ã©ãŒã®åœ©åºŠããããã«äžããæãããã */
}
}
body {
background-color: var(--bg-color);
color: var(--text-color);
}
.brand-button {
background-color: var(--brand-color);
color: #fff;
}
ãã®äŸã§ã¯ããŠãŒã¶ãŒãããŒã¯ã«ã©ãŒã¹ããŒã ã奜ããã©ããããã§ãã¯ããŠããŸããããããã§ããã°ãçžå¯Ÿè²æ§æã䜿çšããŠãæãèæ¯ã«å¯Ÿããã³ã³ãã©ã¹ããåäžãããããã«ãã©ã³ãã«ã©ãŒã®åœ©åºŠããããã«äžããæããããŠããŸããããã«ãããããŒã¯ã¢ãŒãã§ã®ãŠãŒã¶ãŒäœéšãåäžããã€ã€ããã©ã³ãã¢ã€ãã³ãã£ãã£ã®äžè²«æ§ãä¿ã€ããšãã§ããŸãã
LabïŒèŒåºŠãaãbïŒ
LabïŒãŸãã¯CIELABïŒã¯ãç¥èŠçã«åäžã«ãªãããã«èšèšãããè²ç©ºéã§ããããã¯ãè²ã®å€ã®å€åããå ã®è²ã«é¢ä¿ãªããç¥èŠãããè²ã®å·®ã®å€åãšã»ãŒçãããªãããšãæå³ããŸãã以äžã®3ã€ã®èŠçŽ ã§å®çŸ©ãããŸãïŒ
- L: èŒåºŠïŒLightnessïŒïŒ0-100%ïŒã0ã¯é»ã100ã¯çœã§ãã
- a: ç·-赀軞äžã®äœçœ®ãè² ã®å€ã¯ç·ãæ£ã®å€ã¯èµ€ã§ãã
- b: é-é»è»žäžã®äœçœ®ãè² ã®å€ã¯éãæ£ã®å€ã¯é»ã§ãã
Labã®å©ç¹ïŒ
- ç¥èŠçåäžæ§ïŒ Labã®ç¥èŠçåäžæ§ã¯ãè²è£æ£ãã¢ã¯ã»ã·ããªãã£ãã§ãã¯ãªã©ãæ£ç¢ºãªè²ã®å·®ãéèŠãšãªãã¿ã¹ã¯ã«çæ³çã§ãã
- åºãè²åïŒ Labã¯RGBãHSLãããåºãç¯å²ã®è²ã衚çŸã§ããŸãã
- ã¢ã¯ã»ã·ããªãã£ïŒ Labã¯ãããã¹ããšèæ¯ã®éã«ååãªã«ã©ãŒã³ã³ãã©ã¹ãã確ä¿ããããã®ã¢ã¯ã»ã·ããªãã£èšç®ã§ãã°ãã°äœ¿çšãããŸããWCAGïŒWeb Content Accessibility GuidelinesïŒã¯ãLabè²ç©ºéãšå¯æ¥ã«é¢é£ããçžå¯ŸèŒåºŠã«åºã¥ãèšç®åŒã䜿çšããŠããŸãã
äŸïŒã¢ã¯ã»ã·ããªãã£åäžã®ããã®ã«ã©ãŒã³ã³ãã©ã¹ãæ¹å
ååãªã«ã©ãŒã³ã³ãã©ã¹ãã確ä¿ããããšã¯ãã¢ã¯ã»ã·ããªãã£ã«ãšã£ãŠäžå¯æ¬ ã§ããããã¹ãã«ã©ãŒãšèæ¯è²ãWCAG AAã®ã³ã³ãã©ã¹ãæ¯èŠä»¶ïŒ4.5:1ïŒããããã«æºãããŠããªããšããŸããLabã䜿çšããŠãèŠä»¶ãæºãããŸã§ããã¹ãã«ã©ãŒã®èŒåºŠã調æŽã§ããŸãã
æ³šïŒ çžå¯Ÿè²æ§æã䜿ã£ãŠCSSã§çŽæ¥ã³ã³ãã©ã¹ãæ¯ãæäœããããšã¯ã§ããŸããããèŒåºŠã調æŽãããã®åŸã³ã³ãã©ã¹ããã§ãã¯ããŒã«ã§çµæã確èªããããã«äœ¿çšã§ããŸãã
.text {
color: var(--text-color);
background-color: var(--bg-color);
}
:root {
--text-color: #333;
--bg-color: #eee;
}
/*äŸïŒããã¯å®éã«ã¯ã³ã³ãã©ã¹ãæ¯ãçŽæ¥èšç®ããŸããã*/
/*èŒåºŠã調æŽããæŠå¿µçãªäŸã§ã*/
.accessible-text {
--current-text-color: var(--text-color);
color: color(lab var(--current-text-color) calc(l + 10) a b); /* ããã¹ãã10åäœæããããŸããããã¯ããã¹ãè²ã®Lå€ã100ã«è¿ãå Žåãããç¹ãŸã§ãã广ããããŸãããæãããã«ã¯ãæžç®ããŸã*/
}
ãã®äŸã§ã¯ãã³ã³ãã©ã¹ããæ¹åããããã«ããã¹ãã«ã©ãŒãæããããããšããŠããŸããCSSã§ã³ã³ãã©ã¹ãæ¯ãèšç®ããããšã¯ã§ããªãããã倿ŽåŸã«çµæã確èªããå¿ èŠã«å¿ããŠä¿®æ£ããå¿ èŠããããŸãã
OklabïŒLabã®æ¹è¯ç
Oklabã¯ãLabã®ããã€ãã®ç¥èŠçãªæ¬ ç¹ã«å¯ŸåŠããããã«èšèšãããæ¯èŒçæ°ããè²ç©ºéã§ããããã«åªããç¥èŠçåäžæ§ãç®æããŠãããè²ã®å€ã®å€åãç¥èŠãããè²ã«ã©ã®ããã«åœ±é¿ããããäºæž¬ããããããŸããå€ãã®å ŽåãOklabã¯Labãšæ¯èŒããŠãç¹ã«åœ©åºŠãšèŒåºŠãæ±ãéã«ãããã¹ã ãŒãºã§èªç¶ãªè²ã®èª¿æŽæ¹æ³ãæäŸããŸãã
çžå¯Ÿè²æ§æã§Oklabã䜿çšããã®ã¯Labã䜿ãã®ãšäŒŒãŠããŸããåã«è²ç©ºéãšããŠoklab
ãæå®ããã ãã§ãïŒ
.element {
color: color(oklab #ff0000 calc(l * 1.1) a b); /*è²ã10%æãããã*/
}
å®è·µçãªäŸãšãŠãŒã¹ã±ãŒã¹
HSLãšLabãšçµã¿åãããçžå¯Ÿè²æ§æã¯ãWebãã¶ã€ã³ã«å¹ åºãå¯èœæ§ããããããŸãã以äžã«ããã€ãã®å®è·µçãªäŸãæããŸãïŒ
- ã«ã©ãŒãã¬ããã®çæïŒ åºæ¬è²ãäœæããHSLã䜿çšããŠè£è²ãé¡äŒŒè²ããŸãã¯ãã©ã€ã¢ãè²ã®ãã¬ãããçæããŸãã
- èŠçŽ ã®ãã€ã©ã€ãïŒ ãããŒæããã©ãŒã«ã¹æã«èŠçŽ ã®èæ¯è²ãæãããããæããããããŠãèŠèŠçãªãã£ãŒãããã¯ãæäŸããŸãã
- 埮åŠãªããªãšãŒã·ã§ã³ã®äœæïŒ è²çžã圩床ã«ããããªå€åãå ããŠãæ·±ã¿ãšèŠèŠçãªé¢çœããçã¿åºããŸãã
- åçãªããŒãèšå®ïŒ ã©ã€ãã¢ãŒããšããŒã¯ã¢ãŒããå®è£ ãããããŠãŒã¶ãŒããŠã§ããµã€ãã®ã«ã©ãŒã¹ããŒã ãã«ã¹ã¿ãã€ãºã§ããããã«ããŸãã
- ã¢ã¯ã»ã·ããªãã£ã®åäžïŒ èŠèŠé害ãæã€ãŠãŒã¶ãŒã®ããã«ååãªã³ã³ãã©ã¹ãã確ä¿ããããã«è²ã調æŽããŸãã
äŸïŒHSLã§ã«ã©ãŒãã¬ãããçæãã
:root {
--base-color: #29abe2; /* æããé */
--complementary-color: color(hsl var(--base-color) calc(h + 180) s l);
--analogous-color-1: color(hsl var(--base-color) calc(h + 30) s l);
--analogous-color-2: color(hsl var(--base-color) calc(h - 30) s l);
--triadic-color-1: color(hsl var(--base-color) calc(h + 120) s l);
--triadic-color-2: color(hsl var(--base-color) calc(h - 120) s l);
}
.base {
background-color: var(--base-color);
}
.complementary {
background-color: var(--complementary-color);
}
.analogous-1 {
background-color: var(--analogous-color-1);
}
.analogous-2 {
background-color: var(--analogous-color-2);
}
.triadic-1 {
background-color: var(--triadic-color-1);
}
.triadic-2 {
background-color: var(--triadic-color-2);
}
ãã®äŸã¯ãåäžã®åºæ¬è²ããHSLã䜿çšããŠè²ã®ãã¬ãããçæããæ¹æ³ã瀺ããŠããŸãããã®ã³ãŒããç°¡åã«å¿çšããŠãããŸããŸãªè²ã®èª¿åãäœãåºããç¹å®ã®ãã¶ã€ã³ããŒãºã«åãããŠèª¿æŽããããšãã§ããŸãã
äŸïŒLabã§ãããŒãšãã§ã¯ããäœæãã
.button {
background-color: #4caf50; /* ç·è² */
color: #fff;
border: none;
padding: 10px 20px;
cursor: pointer;
transition: background-color 0.3s ease;
}
.button:hover {
background-color: color(lab #4caf50 l calc(a * 1.1) calc(b * 1.1)); /* ãããã«æããããaãšbãå¢å ããã */
}
ããã§ã¯ãLabã䜿çšããŠãããŒæã«è²ããããã«æããããèµ€ãšé»ã®æ¹åã«ã·ãããããããšã§ããŠãŒã¶ãŒã«å¯ŸããŠåŸ®åŠãªãããèªèããããèŠèŠçãªãã£ãŒãããã¯ãäœæããŠããŸãã
ãã©ãŠã¶ã®äºææ§ãšãã©ãŒã«ããã¯
ä»ã®æ°ããCSSæ©èœãšåæ§ã«ããã©ãŠã¶ã®äºææ§ã¯éèŠãªèæ ®äºé ã§ããçžå¯Ÿè²æ§æã¯ãChromeãFirefoxãSafariãEdgeãå«ãã»ãšãã©ã®ã¢ãã³ãã©ãŠã¶ã§ãµããŒããããŠããŸããããããå€ããã©ãŠã¶ã§ã¯ãµããŒããããŠããªãå¯èœæ§ããããŸãã
ãŠã§ããµã€ãããã¹ãŠã®ãã©ãŠã¶ã§åäœããããã«ããããã«ã¯ãçžå¯Ÿè²æ§æããµããŒãããŠããªããã©ãŠã¶ã«å¯ŸããŠãã©ãŒã«ããã¯ãæäŸããããšãäžå¯æ¬ ã§ããããã¯ãCSS倿°ãš@supports
ã¢ããã«ãŒã«ã䜿çšããããšã§å®çŸã§ããŸãã
:root {
--base-color: #29abe2;
--highlight-color: #33b5e5; /* ãã©ãŒã«ããã¯çšã®è² */
}
@supports (color: color(hsl var(--base-color) h calc(s * 1.2) l)) {
:root {
--highlight-color: color(hsl var(--base-color) h calc(s * 1.2) l); /* ãµããŒããããŠããå Žåã¯çžå¯Ÿè²æ§æãäœ¿çš */
}
}
.highlight {
background-color: var(--highlight-color);
}
ãã®äŸã§ã¯ããã©ãŒã«ããã¯çšã®è²ïŒ#33b5e5
ïŒãå®çŸ©ããæ¬¡ã«@supports
ã¢ããã«ãŒã«ã䜿çšããŠãã©ãŠã¶ãçžå¯Ÿè²æ§æããµããŒãããŠãããã©ããããã§ãã¯ããŸãããµããŒãããŠããå Žåã¯ã--highlight-color
倿°ãçžå¯Ÿè²æ§æã䜿çšããŠçæãããè²ã§æŽæ°ããŸããããã«ãããå€ããã©ãŠã¶ã®ãŠãŒã¶ãŒã§ããæ°ãããã©ãŠã¶ãšå
šãåãè²ã§ã¯ãªãã«ããããã€ã©ã€ããããèŠçŽ ãèŠãããšãã§ããŸãã
ã¢ã¯ã»ã·ããªãã£ã«é¢ããèæ ®äºé
çžå¯Ÿè²æ§æã¯èŠèŠçã«é åçãªãã¶ã€ã³ãäœæããããã®åŒ·åãªããŒã«ãšãªãåŸãŸãããã¢ã¯ã»ã·ããªãã£ãèæ ®ããããšãéåžžã«éèŠã§ããäœæããè²ã®çµã¿åããããèŠèŠé害ãæã€ãŠãŒã¶ãŒã«ãšã£ãŠååãªã³ã³ãã©ã¹ããæäŸããããšã確èªããŠãã ãããããŒã«ãšããŠWebAIM Contrast Checkerã®ãããªãã®ã䜿çšããŠãè²ã®çµã¿åãããWCAG AAãŸãã¯AAAã®ã³ã³ãã©ã¹ãæ¯èŠä»¶ãæºãããŠããããšã確èªããŠãã ããã
è²ã®ç¥èŠã¯å人ã«ãã£ãŠå€§ããç°ãªãããšãå¿ããªãã§ãã ãããããŸããŸãªçš®é¡ã®è²èŠç°åžžãèŠèŠé害ãæã€ãŠãŒã¶ãŒãšãã¶ã€ã³ããã¹ãããŠã圌ãããŠã§ããµã€ãã容æã«èªèããæäœã§ããããšã確èªããããšãæ€èšããŠãã ããã
ãŸãšã
CSSçžå¯Ÿè²æ§æã¯ãç¹ã«HSLããã³Labè²ç©ºéãšçµã¿åãããããšã§ãWebãã¶ã€ããŒã«ãšã£ãŠç»æçãªæ©èœãšãªããŸããããã«ãããåçãªããŒãã埮åŠãªããªãšãŒã·ã§ã³ããããŠã¢ã¯ã»ã·ãã«ãªãã¶ã€ã³ããããç°¡åãã€æè»ã«äœæããåãåŸãããŸããHSLãšLabã®ååãçè§£ããå€ããã©ãŠã¶ã®ããã®ãã©ãŒã«ããã¯ãæäŸããããšã§ããã®åŒ·åãªæ©èœã掻çšããŠãäžçäžã®ãŠãŒã¶ãŒã®ããã«èŠèŠçã«èŠäºã§å æ¬çãªäœéšãåµé ããããšãã§ããŸãã
çžå¯Ÿè²æ§æã®åãæŽ»çšããããªãã®Webãã¶ã€ã³ã¹ãã«ã次ã®ã¬ãã«ã«åŒãäžããŸããããããŸããŸãªè²ç©ºéãæ°åŠçæäœãã¢ã¯ã»ã·ããªãã£ã®èæ ®äºé ã詊ããŠã誰ãã«ãšã£ãŠçŸããããã€å æ¬çãªãŠã§ããµã€ããåµé ããŠãã ããã
ãããªãåŠç¿ã®ããã«
- MDN Web Docsã®çžå¯Ÿè²æ§æã«é¢ããèšäº
- Lea Verouã«ããçžå¯Ÿè²æ§æã«é¢ããèšäº
- WebKitããã°ã®CSSçžå¯Ÿè²æ§æã«é¢ããèšäº
CSSçžå¯Ÿè²æ§æãçè§£ãæŽ»çšããããšã§ãã°ããŒãã«ãªèŠèŽè ã«å¯Ÿå¿ãããããåçã§ãã¢ã¯ã»ã·ãã«ã§ãèŠèŠçã«é åçãªãŠã§ããµã€ããäœæã§ããŸããè²ã䜿ã£ãŠãã¶ã€ã³ããéã¯ãåžžã«ã¢ã¯ã»ã·ããªãã£ãšãŠãŒã¶ãŒäœéšãæåªå ããããšãå¿ããªãã§ãã ããã